package ejb;

import java.rmi.RemoteException;
import java.util.Hashtable;
import java.util.List;

import javax.ejb.Stateless;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import org.apache.log4j.Level;
import org.apache.log4j.Logger;

import bean.ArtPendiente;
import bean.Articulo;
import bean.EnvioTienda;
import bean.PendienteFabricacion;
import ejbInterfaces.AdministradorArticulosBeanLocal;
import ejbInterfaces.AdministradorEnvioTiendaBeanLocal;
import ejbInterfaces.AdministradorRepAFBeanLocal;
import ejbInterfaces.AdministradorSolDistBeanLocal;
import ejbInterfaces.AdministradorSolFabBeanLocal;
import ejbInterfaces.FacadeBeanRemote;

/**
 * Session Bean implementation class Facade
 */
@Stateless
public class FacadeBean implements FacadeBeanRemote {

	private InitialContext context;
	static Logger logger = Logger.getLogger(FacadeBean.class);

	/**
	 * Default constructor.
	 */
	public FacadeBean() {
		init();
	}

	private void init() {
		Hashtable props = new Hashtable();
		props.put(InitialContext.INITIAL_CONTEXT_FACTORY,
				"org.jnp.interfaces.NamingContextFactory");
		// Url completa de ubicacion del servidor de aplicaciones
		props.put(InitialContext.PROVIDER_URL, "jnp://127.0.0.1:1099");
		// Objeto del tipo InitialContext
		try {
			context = new InitialContext(props);

		} catch (NamingException e) {
			e.printStackTrace();
			logger.log(Level.ERROR, "Error inicializando el contexto, FacadeBean", e );
		}
	}

	
	//---------------------NUEVO ARTICULO-----------------------------
	public List<Articulo> obtenerArticulos() throws RemoteException {
		String naming = "EAP/AdministradorArticulosBean/local";
		AdministradorArticulosBeanLocal articulosLocal = null;

		try {
			articulosLocal = (AdministradorArticulosBeanLocal) context
					.lookup(naming);
		} catch (NamingException e) {
			logger.log(Level.ERROR, e );
			e.printStackTrace();
		}
		return articulosLocal.obtenerArticulos();

	}

	public Articulo obtenerNuevoArticulo() throws RemoteException {
		String naming = "EAP/AdministradorArticulosBean/local";
		AdministradorArticulosBeanLocal articulosLocal = null;

		try {
			articulosLocal = (AdministradorArticulosBeanLocal) context
					.lookup(naming);
		} catch (NamingException e) {
			logger.log(Level.ERROR, e );
			e.printStackTrace();
		}
		return articulosLocal.obtenerNuevoArticulo();
	}

	public void guardarNuevoArticulo(Articulo articuloNuevo) {
		String naming = "EAP/AdministradorArticulosBean/local";
		AdministradorArticulosBeanLocal articulosLocal = null;

		try {
			articulosLocal = (AdministradorArticulosBeanLocal) context.lookup(naming);
			articulosLocal.guardarNuevoArticulo(articuloNuevo);
		} catch (NamingException e) {
			logger.log(Level.ERROR, e );
			e.printStackTrace();
		}
	}
	
	
	//---------------------SOLICITUD DISTRIBUCION-----------------------------
	public List<ArtPendiente> obtenerArticulosAEnviar() throws RemoteException {
		String naming = "EAP/AdministradorSolDistBean/local";
		AdministradorSolDistBeanLocal solDistLocal = null;
		List<ArtPendiente> artEnviar = null;
		try {
			solDistLocal = (AdministradorSolDistBeanLocal) context
					.lookup(naming);
			List<ArtPendiente> listaTotal = solDistLocal.leerSolDist();
			artEnviar = solDistLocal.obtenerArticulosAEnviar(listaTotal);
		} catch (NamingException e) {
			e.printStackTrace();
			logger.log(Level.ERROR, e );
		}
		return artEnviar;
	}

	public List<ArtPendiente> obtenerArticulosPendientes()
			throws RemoteException {
		String naming = "EAP/AdministradorSolDistBean/local";
		AdministradorSolDistBeanLocal solDistLocal = null;
		List<ArtPendiente> artPendientes = null;

		try {
			solDistLocal = (AdministradorSolDistBeanLocal) context.lookup(naming);
			List<ArtPendiente> listaTotal = solDistLocal.leerSolDist();
			artPendientes = solDistLocal.obtenerArticulosPendientes(listaTotal);
		} catch (NamingException e) {
			e.printStackTrace();
			logger.log(Level.ERROR, e );
		}

		return artPendientes;
	}
	
	
	public void updateStockArtEnviar() throws RemoteException {
		String naming = "EAP/AdministradorSolDistBean/local";
		AdministradorSolDistBeanLocal solDistLocal = null;
		
		try {
			solDistLocal = (AdministradorSolDistBeanLocal) context.lookup(naming);
			List<ArtPendiente> listaTotal = solDistLocal.leerSolDist();
			solDistLocal.updateStockArtEnviar(listaTotal);
		} catch (NamingException e) {
			e.printStackTrace();
			logger.log(Level.ERROR, e );
		}
	}
	
	
	//---------------------SOLICITUD FABRICACION-----------------------------
	public List<PendienteFabricacion> obtenerArticulosPendientesFabricacion()
			throws RemoteException {
		String naming = "EAP/AdministradorSolFabBean/local";
		AdministradorSolFabBeanLocal solFabLocal = null;
		List<PendienteFabricacion> pendientesFab = null;

		try {
			solFabLocal = (AdministradorSolFabBeanLocal) context.lookup(naming);
			pendientesFab = solFabLocal.obtenerArticulosPendientesFabricacion();
		} catch (NamingException e) {
			e.printStackTrace();
			logger.log(Level.ERROR, e );
		}

		return pendientesFab;

	}

	public void generarSolFabr(List<PendienteFabricacion> listaFabricacion)
			throws RemoteException {
		String naming = "EAP/AdministradorSolFabBean/local";
		AdministradorSolFabBeanLocal solFabLocal = null;
		try {
			solFabLocal = (AdministradorSolFabBeanLocal) context.lookup(naming);
			solFabLocal.generarSolFabr(listaFabricacion);
		} catch (NamingException e) {
			e.printStackTrace();
			logger.log(Level.ERROR, e );
		}
	}

	
	//---------------------REPOSICION FABRICA-----------------------------
	public List<Articulo> obtenerArticulosRecibidos() throws RemoteException {
		String naming = "EAP/AdministradorRepAFBean/local";
		AdministradorRepAFBeanLocal repAFBeanLocal = null;
		List<Articulo> listaRecibida = null;
		try {
			repAFBeanLocal = (AdministradorRepAFBeanLocal) context
					.lookup(naming);
			listaRecibida = repAFBeanLocal.obtenerArticulosRecibidos();
		} catch (NamingException e) {
			e.printStackTrace();
			logger.log(Level.ERROR, e );
		}
		return listaRecibida;
	}


	public List<ArtPendiente> obtenerArticulosPendientesEnvio(List<Articulo> recibidos)
			throws RemoteException {
		String naming = "EAP/AdministradorRepAFBean/local";
		AdministradorRepAFBeanLocal repAFBeanLocal = null;
		List<ArtPendiente> listaPendienteEnvio = null;
		try {
			repAFBeanLocal = (AdministradorRepAFBeanLocal) context.lookup(naming);
			listaPendienteEnvio = repAFBeanLocal.obtenerArticulosPendientesEnvio(recibidos);
		} catch (NamingException e) {
			e.printStackTrace();
			logger.log(Level.ERROR, e );
		}
		return listaPendienteEnvio;
	}
	
	public void actualizarPedidos(List<Articulo> articulos,
			List<ArtPendiente> pendientes) throws RemoteException {
		String naming = "EAP/AdministradorRepAFBean/local";
		AdministradorRepAFBeanLocal repAFLocal = null;
		
		try {
			repAFLocal = (AdministradorRepAFBeanLocal) context.lookup(naming);
			repAFLocal.actualizarPedidos(articulos, pendientes);
		} catch (NamingException e) {
			e.printStackTrace();
			logger.log(Level.ERROR, e );
		}
		
	}



	//---------------------ENVIO A TIENDA-----------------------------
	public List<EnvioTienda> obtenerEnviosTienda() throws RemoteException {
		String naming = "EAP/AdministradorEnvioTiendaBean/local";
		AdministradorEnvioTiendaBeanLocal envTBeanLocal = null;
		List<EnvioTienda> listaEnvios = null;
		try {
			envTBeanLocal = (AdministradorEnvioTiendaBeanLocal) context.lookup(naming);
			listaEnvios = envTBeanLocal.obtenerEnviosATiendas();
		} catch (Exception e) {
			e.printStackTrace();
			logger.log(Level.ERROR, e );
		}
		return listaEnvios;
	}
	
	
	public boolean generarEnviosTiendaXML(List<EnvioTienda> enviosToXML){
		String naming = "EAP/AdministradorEnvioTiendaBean/local";
		AdministradorEnvioTiendaBeanLocal envTBeanLocal = null;
		boolean resultado = false;
		try {
			envTBeanLocal = (AdministradorEnvioTiendaBeanLocal) context.lookup(naming);
			resultado = envTBeanLocal.generarEnviosXML(enviosToXML);
		} catch (Exception e) {
			e.printStackTrace();
			logger.log(Level.ERROR, e );
		}
		return resultado;
	}




	

}
